31 RTC 时钟实验

开发板官网(https://www.edevkit.com/)
本系列教程目录:
- 瑞萨单片机开发教程[一] e2-studio + DAP LINK开发环境搭建
- 瑞萨单片机开发教程[二] Keil/RASC开发环境搭建
- 瑞萨单片机开发教程[三] 新建RASC工程
- 瑞萨单片机开发教程[四] GPIO输出——led实验
- 瑞萨单片机开发教程[五] GPIO输入——按键key实验
- 瑞萨单片机开发教程[六] ICU外部中断实验
- 瑞萨单片机开发教程[七] SCI UART串口通信实验
- 瑞萨单片机开发教程[八] DMAC 串口数据传输实验
- 瑞萨单片机开发教程[九] ADC 电压采集实验
RTC 时钟实验
本章目标:
- 了解 RA6M5 处理器的 RTC 模块
- 学会使用 RASC 配置 RTC 模块,使用 API 读写数据。
硬件设计(略,参见配套硬件原理图)
软件设计
新建工程
复制一份“07 SCI_UART_Recv_send”修改文件夹名“31 RTC”,双击打开 EBF_RA6M5.uvprojx 工程,通过 Keil 的新建文件新建 rtc.c 和 rtc.h 保存到工程目录下的 src 文件夹中。
FSP 配置
Keil 界面选择 “Tools”→“RA Smart Configurator” 打开 RASC 界面。
在 “Pins” 添加 RTC 设备。

添加 RTC Stack 模块。

配置 RTC Stack 参数。

| Parameter Checking | 参数检查,如果设置为 Enabled 则会检查 RTC 设置的日历时间是否合法,并通过年月日自动计算星期。 |
|---|---|
| Set Source Clock in Open | 若设置为 Enabled,则在函数 R_RTC_Open 中初始化时钟源,若设置为 Disabled,必须调用 R_RTC_ClockSourceSet 来设置 RTC 时钟源。 |
| Name | 模块名字,可以根据个人需要取名。 |
| Clock Source | 设置时钟源,可以选择 LOCO 和 Sub-Clock。 |
| Frequency Comparison Value(LOCO) | 使用 LOCO 作为时钟源时的分频值,取值范围是 7-511,默认为 255, 则此时输出给日历计数器/二进制计数器的时钟脉冲为 LOCO/(255+1) = 32768/256 = 128Hz |
| Automatic Adjustment Mode | 自动校正模式,用于校正 Sub-Clock 震荡过快或过慢引起的误差 (例如芯片老化,环境温度过低或过高),默认为 Enable。 |
| Automatic Adjustment Period | 自动校正的时间,可选择 10 秒、1 分钟或 NONE |
| Adjustment Type(Plus-Minus) | 自动校正类型,可以选择 None、Addition 或 Subtraction。选择 Addition 则是在 每次自动校正的时候在分频器中加上 Error Adjustment Value。 选择 Subtraction 则是在每次自动校正的时候在分频器中减去 Error Adjustment Value。 |
| Error Adjustment Value | 在触发自动校正时候分频器减去或增加的值。 |
| Callback | RTC 中断回调函数的名称,根据读者需求进行设置即可。 |
| Alarm Interrupt Priority | 选择闹钟中断的优先级,如果选择 Disabled 则不使能闹钟中断。 |
| Period Interrupt Priority | 选择周期性中断的优先级,如果选择 Disabled 则不使能周期性中断。 |
| Carry Interrupt Priority | 选择进位中断的优先级。 |
| RTCOUT | 输出引脚选择,可输出 1Hz 或 64Hz 的方波,无法在待机模式下使用。 |
| RTCICn | 输入捕获引脚选择。 |
配置完成之后可以按下快捷键 “Ctrl + S” 保存,最后点击 “Generate Project Content” 按钮,让软件自动生成配置代码即可。
程序设计
初始化 RTC 模块,设置时钟时间为当前时间,设置时钟中断时间为 1s,在中断回调中获取当前时间并打印到串口。
- 打开 RTC 设备
fsp_err_t R_RTC_Open(rtc_ctrl_t * const p_ctrl,
rtc_cfg_t const * const p_cfg);
- 时钟源设置
fsp_err_t R_RTC_ClockSourceSet(rtc_ctrl_t * const p_ctrl);
- 时间设置
fsp_err_t R_RTC_CalendarTimeSet(rtc_ctrl_t * const p_ctrl,
rtc_time_t * const p_time);
- 时间读取
fsp_err_t R_RTC_CalendarTimeGet(rtc_ctrl_t * const p_ctrl,
rtc_time_t * const p_time);
- 设置中断时间
fsp_err_t R_RTC_PeriodicIrqRateSet(rtc_ctrl_t * const p_ctrl,
rtc_periodic_irq_select_t const rate);
程序编写
rtc.h 头文件定义初始化。
#ifndef BSP_RTC_H
#define BSP_RTC_H
#include "hal_data.h"
void rtc_Init(void);
#endif
rtc.c 中初始化设置时间,中断函数打印时间。
#include "rtc.h"
#include "led.h"
rtc_time_t get_time;
void rtc_Init(void)
{
//初始化时设定的时间
rtc_time_t set_time =
{
.tm_year = 2026-1900, //年
.tm_mon = 1 - 1, //月
.tm_wday = 2, //星期
.tm_mday = 27, //日
.tm_hour = 11, //时
.tm_min = 15, //分
.tm_sec = 25, //秒
};
//打开RTC模块
R_RTC_Open (g_rtc0.p_ctrl, g_rtc0.p_cfg);
//时钟源设置,如果在FSP Configuration设置"Set Source Clock in Open"为"enabled",那这一步可以被跳过
R_RTC_ClockSourceSet (g_rtc0.p_ctrl);
//设置当前时间
R_RTC_CalendarTimeSet (g_rtc0.p_ctrl, &set_time);
//设置周期中断的周期为1秒
R_RTC_PeriodicIrqRateSet (&g_rtc0_ctrl, RTC_PERIODIC_IRQ_SELECT_1_SECOND);
}
void rtc_callback(rtc_callback_args_t *p_args)
{
switch (p_args->event)
{
case RTC_EVENT_PERIODIC_IRQ:
LED1_TOGGLE();
//获取当前时间
R_RTC_CalendarTimeGet(&g_rtc0_ctrl, &get_time);
printf("\r\n%d-%d-%d-%d:%d:%d\r\n", get_time.tm_year + 1900,
get_time.tm_mon + 1,
get_time.tm_mday,
get_time.tm_hour,
get_time.tm_min,
get_time.tm_sec);
break;
default:
break;
}
}
在 hal_entry.c 文件中添加头文件 rtc.h,初始化 RTC。
void hal_entry(void)
{
/* TODO: add your own code here */
led_Init(); // LED 初始化
uart0_Init();
rtc_Init();
printf("start rtc test\r\n");
while(1)
{
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS); //延时1秒
//扫描uart接收
uart_scan_rx();
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
下载验证
连接下载器,将程序编译并下载到开发板之后,按下复位按键来复位开发板,程序启动初始化完。
可以看到每秒打印时间。
